package com.thread.threadfirst.javaBase;


import javax.xml.crypto.Data;
import java.util.Date;

/**
 * 内部类调用
 */
public class StaticClass {

    public static String outerStr="outer class "+System.currentTimeMillis();

    static {
        System.out.println("外部类静态代码块…… "+System.currentTimeMillis());
    }

    {
        System.out.println("外部类普通代码块…… "+System.currentTimeMillis());
    }

    public StaticClass(){
        System.out.println("外部类构造方法…… "+System.currentTimeMillis());
    }

    public class InnerClass{
        public String innerStr="inner class "+System.currentTimeMillis();

        public InnerClass(){
            System.out.println("非静态内部类构造方法 "+innerStr);
        }

    }

    public static class InterStaticClass{
        public static String innerStaticStr="inner static class "+System.currentTimeMillis();

        static {
            System.out.println("inner static class 静态代码块 "+System.currentTimeMillis());
        }

        public InterStaticClass(){
            System.out.println("静态内部类构造方法  "+innerStaticStr);
        }
    }

    public static void staticMethod(){
        System.out.println("outer class static method…… "+System.currentTimeMillis());
    }

    public void method(){
        System.out.println("outer class method…… "+System.currentTimeMillis());
    }

    public static void main(String[] args) {
//        StaticClass staticClass=new StaticClass();
//        System.out.println("外部静态变量 "+StaticClass.outerStr);
//        System.out.println("=外部静态方法=");
//        StaticClass.staticMethod();
//        System.out.println("=外部非静态方法=");
//        staticClass.method();
//
//        System.out.println("=======调用非静态内部类========");
//        System.out.println(staticClass.new InnerClass().innerStr);
//
//        System.out.println("=======调用静态内部类========");
//        System.out.println(InterStaticClass.innerStaticStr);

        /*
        运行结果(上面全部执行结果)：
        外部类静态代码块…… 1588390015658
        外部类普通代码块…… 1588390015659
        外部类构造方法…… 1588390015659
        外部静态变量 outer class 1588390015658
                =======调用非静态内部类========
        非静态内部类构造方法 inner class 1588390015659
        inner class 1588390015659
                =======调用静态内部类========
        inner static class 静态代码块 1588390015660
        inner static class 1588390015660

        运行结果(只执行 InterStaticClass.innerStaticStr 的执行结果)：
        外部类静态代码块…… 1588390429685
        =======调用静态内部类========
        inner static class 静态代码块 1588390429687
        inner static class 1588390429687
        */

        Class aClass= null;
        try {
            aClass = Class.forName("com.thread.threadfirst.javaBase.StaticClass");//通过反射来获取类 并加载了类，因为运行了静态代码块。
            System.out.println(aClass.getSimpleName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
